/**
 * 分页功能插件
 * @file
 * @since 1.2.6.1
 */
UE.plugins["pagebreak"] = function () {
    var me = this,
        notBreakTags = ["td"];
    me.setOpt("pageBreakTag", "_ueditor_page_break_tag_");

    function fillNode(node) {
        if (domUtils.isEmptyBlock(node)) {
            var firstChild = node.firstChild,
                tmpNode;

            while (
                firstChild &&
                firstChild.nodeType == 1 &&
                domUtils.isEmptyBlock(firstChild)
                ) {
                tmpNode = firstChild;
                firstChild = firstChild.firstChild;
            }
            !tmpNode && (tmpNode = node);
            domUtils.fillNode(me.document, tmpNode);
        }
    }

    //分页符样式添加

    me.ready(function () {
        utils.cssRule(
            "pagebreak",
            ".pagebreak{display:block;clear:both !important;cursor:default !important;width: 100% !important;margin:0;}",
            me.document
        );
    });

    function isHr(node) {
        return (
            node &&
            node.nodeType == 1 &&
            node.tagName == "HR" &&
            node.className == "pagebreak"
        );
    }

    me.addInputRule(function (root) {
        root.traversal(function (node) {
            if (node.type == "text" && node.data == me.options.pageBreakTag) {
                var hr = UE.uNode.createElement(
                    '<hr class="pagebreak" noshade="noshade" size="5" style="-webkit-user-select: none;">'
                );
                node.parentNode.insertBefore(hr, node);
                node.parentNode.removeChild(node);
            }
        });
    });
    me.addOutputRule(function (node) {
        utils.each(node.getNodesByTagName("hr"), function (n) {
            if (n.getAttr("class") == "pagebreak") {
                var txt = UE.uNode.createText(me.options.pageBreakTag);
                n.parentNode.insertBefore(txt, n);
                n.parentNode.removeChild(n);
            }
        });
    });

    /**
     * 插入分页符
     * @command pagebreak
     * @method execCommand
     * @param { String } cmd 命令字符串
     * @remind 在表格中插入分页符会把表格切分成两部分
     * @remind 获取编辑器内的数据时， 编辑器会把分页符转换成“_ueditor_page_break_tag_”字符串，
     *          以便于提交数据到服务器端后处理分页。
     * @example
     * ```javascript
     * editor.execCommand( 'pagebreak'); //插入一个hr标签，带有样式类名pagebreak
     * ```
     */

    me.commands["pagebreak"] = {
        execCommand: function () {
            var range = me.selection.getRange(),
                hr = me.document.createElement("hr");
            domUtils.setAttributes(hr, {
                class: "pagebreak",
                noshade: "noshade",
                size: "5"
            });
            domUtils.unSelectable(hr);
            //table单独处理
            var node = domUtils.findParentByTagName(
                range.startContainer,
                notBreakTags,
                true
                ),
                parents = [],
                pN;
            if (node) {
                switch (node.tagName) {
                    case "TD":
                        pN = node.parentNode;
                        if (!pN.previousSibling) {
                            var table = domUtils.findParentByTagName(pN, "table");
                            //                            var tableWrapDiv = table.parentNode;
                            //                            if(tableWrapDiv && tableWrapDiv.nodeType == 1
                            //                                && tableWrapDiv.tagName == 'DIV'
                            //                                && tableWrapDiv.getAttribute('dropdrag')
                            //                                ){
                            //                                domUtils.remove(tableWrapDiv,true);
                            //                            }
                            table.parentNode.insertBefore(hr, table);
                            parents = domUtils.findParents(hr, true);
                        } else {
                            pN.parentNode.insertBefore(hr, pN);
                            parents = domUtils.findParents(hr);
                        }
                        pN = parents[1];
                        if (hr !== pN) {
                            domUtils.breakParent(hr, pN);
                        }
                        //table要重写绑定一下拖拽
                        me.fireEvent("afteradjusttable", me.document);
                }
            } else {
                if (!range.collapsed) {
                    range.deleteContents();
                    var start = range.startContainer;
                    while (
                        !domUtils.isBody(start) &&
                        domUtils.isBlockElm(start) &&
                        domUtils.isEmptyNode(start)
                        ) {
                        range.setStartBefore(start).collapse(true);
                        domUtils.remove(start);
                        start = range.startContainer;
                    }
                }
                range.insertNode(hr);

                var pN = hr.parentNode,
                    nextNode;
                while (!domUtils.isBody(pN)) {
                    domUtils.breakParent(hr, pN);
                    nextNode = hr.nextSibling;
                    if (nextNode && domUtils.isEmptyBlock(nextNode)) {
                        domUtils.remove(nextNode);
                    }
                    pN = hr.parentNode;
                }
                nextNode = hr.nextSibling;
                var pre = hr.previousSibling;
                if (isHr(pre)) {
                    domUtils.remove(pre);
                } else {
                    pre && fillNode(pre);
                }

                if (!nextNode) {
                    var p = me.document.createElement("p");

                    hr.parentNode.appendChild(p);
                    domUtils.fillNode(me.document, p);
                    range.setStart(p, 0).collapse(true);
                } else {
                    if (isHr(nextNode)) {
                        domUtils.remove(nextNode);
                    } else {
                        fillNode(nextNode);
                    }
                    range.setEndAfter(hr).collapse(false);
                }

                range.select(true);
            }
        }
    };
};
